package src.E_Thread;

// 静态代理
// 代理对象和真实对象都要实现同一个接口，代理对象要代理真实角色
// 代理对象做很多真实对象做不了的事情，真实对象专注做自己的事情
public class E06_StaticProxy {
    public static void main(String[] args) {
        new WeddingCompany(new You()).HappyMarry();
        new Thread( () -> {System.out.println("我爱你");} ).start();
    }
}

// 接口（结婚这件事）
// ps：这是一个函数式接口，任何接口如果只包含唯一一个抽象方法就是一个函数式接口，可以用lambda表达式来创建该接口对象
interface Marry{
    void HappyMarry();
}

// 真实对象（主人要做的事）
class You implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("我们盛装出席！");
    }
}

// 代理对象（婚庆公司要做的事）
class WeddingCompany implements Marry{
    private Marry marry; // 需要一个目标对象
    public WeddingCompany(Marry marry) { // 更改构造方法
        this.marry = marry;
    }
    @Override
    public void HappyMarry() {
        before();                 // 代理做的事情
        this.marry.HappyMarry(); // 真实对象做的事情
        after();                // 代理做的事情
    }
    private void before(){
        System.out.println("开始结婚啦，收份子钱");
    }
    private void after(){
        System.out.println("结完婚啦，开始数钱");
    }
}